除了數值外,字串也是屬於 Perl 的純量資料型態。由於 Perl 最強大的功能就在於文字處理與比對,因此字串是一個很重要的資料類別。在 Perl 中,大部分的字串都用雙引號(Double Quote)來界定,而在雙引號中的變數,則會被代換成變數值,例如:
$name = "Timmy"; # $name 的值是 "Timmy" $str1 =“My name is $name"; # $str1 的值是 "My name is Timmy" 在上例中,若不希望 $name 的值被代換成 "Timmy",則我們可在 $name 之前加上一個反斜線:$str2 = "My name is \$name"; # $str2 的值是 "My name is $name" 另一種作法,則是以單引號(Single Quote)來界定字串,此時 Perl 就不會對其內的變數進行代換,例如:$str3 = 'My name is $name'; # $str3 的值是 "My name is $name" 若要將字串相連,可用句點符號,如下:$str4 = "Timmy is " . (2*5) . "years old"; # $str4 的值是 "Timmy is 10 years old" 請注意在上例中,(2*5) 是數值運算,其結果為數值 10,Perl 會將數值 10 轉成字串 "10",再進行字串連接的動作。換句話說,Perl 會進行必要的轉換,讓數值和字串混合的運算,能夠順利的完成。你可以用 length 函數來計算字串的長度,例如:
$leng = length($str4); # 計算 $str4 的長度,傳回值是 21 你也可以用「x」運算來進行字串的重複,例如:$name = "Roger"; $repeat = $name x 3; # $repeat 的值是 "RogerRogerRoger" 由於「x」運算是把前面的運算元看成是字串,把後面的運算元看成是數值(即重複次數),因此我們會有下列結果:$str5 = (1+2) x 4; # $str5 的值是 "3333" $str6 = 4 x (1+2); # $str6 的值是 "444" 聰明的你,看出了其中的道理了嗎?Perl 支援以反斜線開始的特殊字元,可以列表如下:
符號 說明 \a 鈴聲 \b 退位鍵(Backspace) \e Escape 鍵 \f Formfeed \n 換行(Return) \t 定位鍵(Tab) \cJ 控制字元,此例代表 Control-J \xA 16 進位記號,A16 = 1010 = 換行字元 \012 8 進位記號,128 = 1010 = 換行字元 \\ 反斜線 \" 雙引號 \' 單引號 \l 下一個字元改為小寫 \u 下一個字元改為大寫 \L 由下一個字元開始,到\E或字串結束之位置,都改為小寫 \U 由下一個字元開始,到\E或字串結束之位置,都改為大寫 \E 結束 \L 或 \U 的效用 下列程式碼是 Perl 對字串進行各種大小寫變換的例子:
$name = "Roger"; $name1 = "\U$name"; # $name1 的值是 "ROGER" $name2 = "\L$name1"; # $name2 的值是 "roger" $name3 = "\u$name2"; # $name3 的值是 "Roger" $name4 = "\l$name1"; # $name4 的值是 "rOGER" 以下是一個小小的測試程式,列出一些自串的設定方式(tstring.pl),提供各位讀者參考:印出效果如下:
$str1 = hello\n $str2 = hello $str3 = don't $str4 = a string: "test" $str5 = sprite coke $path1 = c:\winnt\temp\ $path2 = c:\winnt\temp $path3 = c:/winnt/temp $path4 = c:\winnt\temp\roger $path5 = c:\winnt\temp\roger 如果你對 Perl 處理字串的方式有所疑義,可以利用類似上述的小程式來進行測試。與字串處理相關的函數,可以列表如下:
符號 說明 chomp 移除字串尾端的換行字元 chop 移除字串尾端的字元 chr 將 ASCII 代碼轉換至字元 crypt 字串加密 hex 將 16 進位表示的字串轉為數值 index 傳回一字串在另一自串出現的第一個位置 lc 轉為小寫字元 lcfirst 第一個字母轉為小寫字元 length 計算字串長度 oct 將 8 進位表示的字串轉為數值 ord 將字元轉換為數值(ASCII 代碼或 Unicode) pack 將數值或字串進行各種壓縮與轉換 q/STRING/ qq/STRING/ reverse 將自串左右顛倒 rindex 傳回一字串在另一自串出現的最後一個位置 sprintf 傳回由 printf 所形成的字串 substr 取出子字串 tr/// 字串轉換運算(Transliteral Operation) uc 將字串全部變成大寫 ucfirst 將字串的第一個字母變成大寫 y/// 字串轉換運算(Transliteral Operation) 若對這些函數的用法不瞭解,可用 perldoc 來取得線上說明,例如,欲讀取 ucfirst 的線上說明,可在電腦的命令視窗輸入
perldoc -f ucfirst 請立刻試試看!我們可用字串來讀取鍵盤輸入,例如:
$a = 上述範例也可以合成一列程式碼:; # 從鍵盤(即標準輸入裝置,STDIN)取得一列文字輸入 chomp($a); # 刪除此輸入字串尾端的換行符號 chomp($a = 若要將一個檔案(test.txt)的內容逐一讀出,可用下列程式碼:); open(FILE, "test.txt") || die("Cannot open file"); $line = 其中第一列的敘述是由兩個函數所構成,再由「||」(代表「或」的邏輯運算)來連結。「open(File, "test.txt")」是開啟 test.txt 檔案,並將檔案指標設定至 FILE;「die("Cannot open file")」則是印出 Cannot open file 的錯誤訊息,並跳出程式碼。換句話說,若順利開啟檔案,則此 open 函數傳回 1,則 Perl 不再執行 die 函數,因為整列敘述由「或」邏輯運算所構成,只要有一者為 1,即可決定整個敘述的值。反之,若 open 函數傳回零(代表開啟檔案失敗),則 Perl 會再執行 die 函數,已確保能夠求得整個敘述的邏輯值。「$line = <FILE>」則是逐次從檔案讀出一列,直到檔案結束,亦即 $line 無定義,或 defined($line) 傳回 0 為止。; while (defined($line)) { print "$line"; $line = ; }
Perl